"""
布局容器组件示例
"""
import sys
import os

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, 
                            QLabel, QPushButton, QLineEdit, QComboBox, QCheckBox)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont, QIcon

from component.container import Card, Group, HBox, VBox, GridBox, ScrollBox
from component.input import Input
from component.button import Button
from component.theme import Theme

class MainWindow(QMainWindow):
    """布局容器组件示例程序的主窗口"""
    
    def __init__(self):
        super().__init__()
        
        # 设置窗口属性
        self.setWindowTitle("布局容器组件示例")
        self.resize(900, 700)
        
        # 创建滚动区域作为中央部件
        scroll_area = ScrollBox()
        self.setCentralWidget(scroll_area)
        
        # 创建主容器
        main_widget = QWidget()
        main_layout = QVBoxLayout(main_widget)
        main_layout.setContentsMargins(20, 20, 20, 20)
        main_layout.setSpacing(20)
        
        # 设置滚动区域的组件
        scroll_area.set_widget(main_widget)
        
        # 添加标题
        title = QLabel("布局容器组件示例")
        title.setFont(QFont("Arial", 24, QFont.Bold))
        title.setAlignment(Qt.AlignCenter)
        main_layout.addWidget(title)
        
        # 添加描述
        description = QLabel("这个示例展示了各种布局容器组件的使用方法，包括卡片、分组、水平布局、垂直布局、网格布局和滚动容器。")
        description.setWordWrap(True)
        description.setAlignment(Qt.AlignCenter)
        main_layout.addWidget(description)
        
        # 添加卡片容器示例
        self._add_card_example(main_layout)
        
        # 添加分组容器示例
        self._add_group_example(main_layout)
        
        # 添加水平和垂直布局容器示例
        self._add_box_layout_example(main_layout)
        
        # 添加网格布局容器示例
        self._add_grid_layout_example(main_layout)
        
        # 添加滚动容器示例
        self._add_scroll_example(main_layout)
        
        # 添加底部间距
        main_layout.addStretch()
    
    def _add_card_example(self, parent_layout):
        """添加卡片容器示例"""
        # 创建卡片容器
        card = Card("卡片容器示例")
        
        # 添加描述
        description = QLabel("卡片容器是一个带有阴影和边框的容器，可以包含任何组件。")
        description.setWordWrap(True)
        card.add_widget(description)
        
        # 添加表单
        form = VBox(margin=10, spacing=10)
        
        # 添加输入框
        username_input = Input(label="用户名", placeholder="请输入用户名")
        form.add_widget(username_input)
        
        password_input = Input(label="密码", placeholder="请输入密码", password_mode=True)
        form.add_widget(password_input)
        
        # 添加按钮
        button_box = HBox(margin=0, spacing=10)
        button_box.add_stretch()
        button_box.add_widget(Button("取消"))
        button_box.add_widget(Button("登录", button_type="primary"))
        
        form.add_widget(button_box)
        card.add_widget(form)
        
        # 添加卡片到父布局
        parent_layout.addWidget(card)
    
    def _add_group_example(self, parent_layout):
        """添加分组容器示例"""
        # 创建分组容器
        group = Group("分组容器示例")
        
        # 添加描述
        description = QLabel("分组容器是一个带有标题的分组，可以包含任何组件。")
        description.setWordWrap(True)
        group.add_widget(description)
        
        # 添加选项
        options = VBox(margin=5, spacing=10)
        
        # 添加复选框
        options.add_widget(QCheckBox("选项 1"))
        options.add_widget(QCheckBox("选项 2"))
        options.add_widget(QCheckBox("选项 3"))
        
        group.add_widget(options)
        
        # 添加分组到父布局
        parent_layout.addWidget(group)
    
    def _add_box_layout_example(self, parent_layout):
        """添加水平和垂直布局容器示例"""
        # 创建水平布局容器
        hbox_container = Card("水平和垂直布局容器示例")
        
        # 添加描述
        description = QLabel("水平布局容器（HBox）和垂直布局容器（VBox）是最基本的布局容器，用于水平或垂直排列组件。")
        description.setWordWrap(True)
        hbox_container.add_widget(description)
        
        # 创建水平布局
        hbox = HBox(margin=10, spacing=10)
        hbox.add_widget(QPushButton("按钮 1"))
        hbox.add_widget(QPushButton("按钮 2"))
        hbox.add_widget(QPushButton("按钮 3"))
        
        hbox_container.add_widget(QLabel("水平布局示例："))
        hbox_container.add_widget(hbox)
        
        # 创建垂直布局
        vbox = VBox(margin=10, spacing=10)
        vbox.add_widget(QPushButton("按钮 A"))
        vbox.add_widget(QPushButton("按钮 B"))
        vbox.add_widget(QPushButton("按钮 C"))
        
        hbox_container.add_widget(QLabel("垂直布局示例："))
        hbox_container.add_widget(vbox)
        
        # 添加到父布局
        parent_layout.addWidget(hbox_container)
    
    def _add_grid_layout_example(self, parent_layout):
        """添加网格布局容器示例"""
        # 创建网格布局容器
        grid_container = Card("网格布局容器示例")
        
        # 添加描述
        description = QLabel("网格布局容器（GridBox）用于在网格中排列组件，可以指定行和列。")
        description.setWordWrap(True)
        grid_container.add_widget(description)
        
        # 创建网格布局
        grid = GridBox(margin=10, spacing=10)
        
        # 添加标签
        grid.add_widget(QLabel("姓名:"), 0, 0)
        grid.add_widget(QLabel("年龄:"), 1, 0)
        grid.add_widget(QLabel("性别:"), 2, 0)
        grid.add_widget(QLabel("职业:"), 3, 0)
        
        # 添加输入控件
        grid.add_widget(QLineEdit(), 0, 1)
        grid.add_widget(QLineEdit(), 1, 1)
        
        gender_combo = QComboBox()
        gender_combo.addItems(["男", "女", "其他"])
        grid.add_widget(gender_combo, 2, 1)
        
        job_combo = QComboBox()
        job_combo.addItems(["学生", "教师", "工程师", "医生", "其他"])
        grid.add_widget(job_combo, 3, 1)
        
        # 添加按钮（跨两列）
        button_box = HBox(margin=0, spacing=10)
        button_box.add_stretch()
        button_box.add_widget(Button("取消"))
        button_box.add_widget(Button("提交", button_type="primary"))
        
        grid.add_widget(button_box, 4, 0, 1, 2)
        
        grid_container.add_widget(grid)
        
        # 添加到父布局
        parent_layout.addWidget(grid_container)
    
    def _add_scroll_example(self, parent_layout):
        """添加滚动容器示例"""
        # 创建滚动容器示例
        scroll_container = Card("滚动容器示例")
        
        # 添加描述
        description = QLabel("滚动容器（ScrollBox）用于在有限的空间中显示大量内容，可以垂直和水平滚动。")
        description.setWordWrap(True)
        scroll_container.add_widget(description)
        
        # 创建滚动容器
        scroll = ScrollBox(horizontal=False)  # 只允许垂直滚动
        scroll.setFixedHeight(150)  # 固定高度以展示滚动效果
        
        # 创建内容容器
        content = QWidget()
        content_layout = QVBoxLayout(content)
        content_layout.setContentsMargins(10, 10, 10, 10)
        content_layout.setSpacing(10)
        
        # 添加多个项目以展示滚动效果
        for i in range(1, 16):
            item = HBox(margin=5, spacing=10)
            item.add_widget(QLabel(f"项目 {i}"))
            item.add_stretch()
            item.add_widget(QPushButton("查看"))
            item.add_widget(QPushButton("编辑"))
            content_layout.addWidget(item)
        
        # 设置滚动区域的组件
        scroll.set_widget(content)
        
        scroll_container.add_widget(scroll)
        
        # 添加到父布局
        parent_layout.addWidget(scroll_container)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    
    # 设置应用样式
    app.setStyleSheet(Theme().get_style_sheet())
    
    window = MainWindow()
    window.show()
    
    sys.exit(app.exec_()) 